package com.atguigu.eduservice.listener;

import com.alibaba.excel.context.AnalysisContext;

import com.alibaba.excel.event.AnalysisEventListener;
import com.atguigu.eduservice.entity.EduSubject;
import com.atguigu.eduservice.entity.excel.SubjectData;
import com.atguigu.eduservice.service.EduSubjectService;
import com.atguigu.servicebase.exceptionhandler.GuliException;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;

public class SubjectExcelListener extends AnalysisEventListener<SubjectData> {
    //因为要操作数据库，就需要这个实现了mapper接口的service的实现类接口，但AnalysisEventListener类自身没有被spring容器管理，
    //就无法通过在类上面加@Service的注解交给spring容器进行管理，就无法自动注入操作数据库的接口，要么自己写jdbc要么通过外面传过来使用
    private EduSubjectService eduSubjectService;

    public SubjectExcelListener() {

    }

    //在EasyExcel.read（）方法调用时候传入AnalysisEventListener的继承业务子类时通过构造器传入一个操作数据库接口使用
    public SubjectExcelListener(EduSubjectService eduSubjectService) {
        this.eduSubjectService = eduSubjectService;
    }

    //读取excel内容，一行一行进行读取，invoke里面实现了读取excel的具体逻辑和验证以及业务
    @Override
    public void invoke(SubjectData subjectData, AnalysisContext analysisContext) {
        if (subjectData == null) {
            throw new GuliException(20001, "文件数据为空");
        }
        //把查询数据库的接口，传进来调用sql方法区数据库查询这个一级目录也就是exce读取的实体类的第一列是否存在，存在就不添加
        //进行一级分类的添加，如果查询没有重复的就不添加，但是可以给下面二级分类提供归属一级分类的sParentId也就是一级的id
        EduSubject existOneSubject = this.existOneSubject(eduSubjectService, subjectData.getOneSubjectName());
        if (existOneSubject == null) {
            existOneSubject = new EduSubject();
            existOneSubject.setParentId("0");
            existOneSubject.setTitle(subjectData.getOneSubjectName());
            boolean save = eduSubjectService.save(existOneSubject);
        }
        //获取分类的id值，无论如何走到这里，要么查询这个对象是有值，没有会在上面赋值
        String pid = existOneSubject.getId();
        EduSubject existTwoSubject = this.existTwoSubject(eduSubjectService, subjectData.getTwoSubjectName(), pid);
        if (existTwoSubject == null) {
            existTwoSubject = new EduSubject();
            existTwoSubject.setTitle(subjectData.getTwoSubjectName());
            existTwoSubject.setParentId(pid);
            boolean save = eduSubjectService.save(existTwoSubject);
        }


    }

    //下面这是去查数据库看，读取excel时一行的第一列是否在数据库存在，
    // 存在就不添加且返回这条数据给第二列做绑定，因为这两列是上下层关系，第二列、第三列一样要写。
    private EduSubject existOneSubject(EduSubjectService eduSubjectService, String name) {
        QueryWrapper<EduSubject> wrapper = new QueryWrapper<>();
        wrapper.eq("title", name).eq("parent_id", "0");
        EduSubject oneSubject = eduSubjectService.getOne(wrapper);
        return oneSubject;

    }

    //下面这是去查数据库验证，读取excel时一行的第二列是否在数据库存在，
    // 存在就不添加且返回这条数据给第其他关联列做绑定，因为这两列是上下层关系，第二列、第三列一样要写。
    private EduSubject existTwoSubject(EduSubjectService eduSubjectService, String name, String pid) {
        QueryWrapper<EduSubject> wrapper = new QueryWrapper<>();
        wrapper.eq("title", name).eq("parent_id", pid);
        EduSubject twoSubject = eduSubjectService.getOne(wrapper);
        return twoSubject;

    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {

    }
}
